package modelo.escenario.tests;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;
import modelo.escenario.Arteria;
import modelo.escenario.Cruce;
import modelo.escenario.Cuadra;
import modelo.escenario.GuiaT;
import modelo.escenario.Recorrido;
import modelo.escenario.Transitable.SentidoTransitable;
import modelo.geometria.Vector;


public class RecorridoTest extends TestCase{
    public RecorridoTest(String arg0) {
        super(arg0);
    }
    public static void main(String[] args) {
        junit.textui.TestRunner.run(RecorridoTest.class);
    }
    public void testCaminoMinimo(){
    	Cruce c1 = new Cruce("1");
		Cruce c2 = new Cruce("2");
		Cruce c3 = new Cruce("3");
		Cruce c4 = new Cruce("4");
		Cruce c5 = new Cruce("5");
		
		Arteria autopista = Arteria.crearAutopista("Juan Bautista Alberdi"); 
		Cuadra cu0 = new Cuadra("0", new Vector(3,2), 4, 3, c1, c2, autopista, SentidoTransitable.NORTE);
		Cuadra cu1 = new Cuadra("1", new Vector(3,2), 4, 3, c2, c3, autopista, SentidoTransitable.NORTE);
		Cuadra cu2 = new Cuadra("2", new Vector(3,2), 4, 3, c3, c5, autopista, SentidoTransitable.NORTE);
		Cuadra cu3 = new Cuadra("3", new Vector(3,2), 4, 3, c5, c4, autopista, SentidoTransitable.NORTE);
		Cuadra cu4 = new Cuadra("4", new Vector(3,2), 4, 3, c4, c2, autopista, SentidoTransitable.NORTE);
		Cuadra cu5 = new Cuadra("5", new Vector(3,2), 4, 3, c3, c1, autopista, SentidoTransitable.NORTE);
		Cuadra cu6 = new Cuadra("6", new Vector(3,2), 4, 3, c2, c5, autopista, SentidoTransitable.NORTE);
		
		List<Cuadra> listaCuadras = new ArrayList<Cuadra>();
		listaCuadras.add(cu0);
		listaCuadras.add(cu1);
		listaCuadras.add(cu2);
		listaCuadras.add(cu3);
		listaCuadras.add(cu4);
		listaCuadras.add(cu5);
		listaCuadras.add(cu6);

		GuiaT guia = new GuiaT(listaCuadras);
		Recorrido r = new Recorrido(guia);
		r.setCruceDesde(c1);
		r.setCruceHasta(c4);
		List<Cuadra> l = r.getCaminoMinimo();
		assertEquals("0",((Cuadra)l.get(0)).getId());
		assertEquals("6",((Cuadra)l.get(1)).getId());
		assertEquals("3",((Cuadra)l.get(2)).getId());
		
		
		/*Le agrego peso a una cuadra*/
		cu6.setPeso(10.0);
		l = r.getCaminoMinimo();
		assertEquals("0",((Cuadra)l.get(0)).getId());
		assertEquals("1",((Cuadra)l.get(1)).getId());
		assertEquals("2",((Cuadra)l.get(2)).getId());
		assertEquals("3",((Cuadra)l.get(3)).getId());
    }
    
    public void testCuadrasDelCruce(){
    	Cruce c1 = new Cruce("1");
		Cruce c2 = new Cruce("2");
		Cruce c3 = new Cruce("3");
		Cruce c4 = new Cruce("4");
		Cruce c5 = new Cruce("5");
		Cruce c6 = new Cruce("6");
		Cruce c7 = new Cruce("7");
		
		Arteria calle = Arteria.crearCalle("Estados Unidos");
		Cuadra cu0 = new Cuadra("0", new Vector(3,2), 4, 3, c1, c2, calle, SentidoTransitable.OESTE);
		Cuadra cu1 = new Cuadra("1", new Vector(8,2), 4, 3, c2, c3, calle, SentidoTransitable.SUR);
		Cuadra cu2 = new Cuadra("2", new Vector(13,2), 4, 3, c3, c6, calle, SentidoTransitable.OESTE);
		Cuadra cu3 = new Cuadra("3", new Vector(18,2), 4, 3, c5, c6, calle, SentidoTransitable.SUR);
		Cuadra cu4 = new Cuadra("4", new Vector(8,2), 4, 3, c4, c2, calle, SentidoTransitable.SUR);
		Cuadra cu5 = new Cuadra("5", new Vector(8,2), 4, 3, c6, c7, calle, SentidoTransitable.SUR);
		Cuadra cu6 = new Cuadra("6", new Vector(8,2), 4, 3, c2, c5, calle, SentidoTransitable.OESTE);
		
		List<Cuadra> listaCuadras = new ArrayList<Cuadra>();
		listaCuadras.add(cu0);
		listaCuadras.add(cu1);
		listaCuadras.add(cu2);
		listaCuadras.add(cu3);
		listaCuadras.add(cu4);
		listaCuadras.add(cu5);
		listaCuadras.add(cu6);

		GuiaT guia = new GuiaT(listaCuadras);
		Recorrido r = new Recorrido(guia);
		r.setCruceDesde(c1);
		r.setCruceHasta(c7);
		/**Recorro cada cuadra del cruce "c2"
		 * y veo que conexion tiene (NORTE,SUR,ESTE,OESTE)*/
		Collection<Cuadra> l = r.obtenerCuadrasDelCruce(c2);
		Iterator<Cuadra> it = l.iterator();
		Cuadra c; 
		while (it.hasNext()){
			c = (Cuadra)it.next();
			if ("0".equals(c.getId())){
				assertEquals(SentidoTransitable.ESTE,c.getConexionCruce(c2));
			}
			if ("4".equals(c.getId())){
				assertEquals(SentidoTransitable.NORTE,c.getConexionCruce(c2));
			}
			if ("6".equals(c.getId())){
				assertEquals(SentidoTransitable.OESTE,c.getConexionCruce(c2));
			}
			if ("1".equals(c.getId())){
				assertEquals(SentidoTransitable.SUR,c.getConexionCruce(c2));
			}
		}
   }
}
